#ifndef _QUEUE_HPP_
#define _QUEUE_HPP_

#include "_linked_list.hpp"

template <typename T>
class Queue
{
public:
  Queue(){
    INIT_LIST_HEAD(&head.link);
    size=0;
  }  
  void enqueue(const T & t){
    Node<T> * tmp=new Node<T>;
    tmp->data=t;
    list_add_tail(&tmp->link,&head.link);
    size++;
  }  
  T dequeue(){
    Node<T> * tmp=list_entry(head.link.next,Node<T>,link);
    T t=tmp->data;
    list_del(&tmp->link);
    size--;
    return t;
  }  
  T front(){
    return list_entry(head.link.next,Node<T>,link)->data;
  }  
  int get_size(){
    return size;
  }  
  
private:
  Node<T> head;
  int size;
};  



#endif
